{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# _*Using Grover's Algorithm to Perform Quantum Search*_\n",
    "\n",
    "This notebook demonstrates how to use the `Qiskit Aqua` library `Grover` search algorithm and process the result."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pylab\n",
    "import numpy as np\n",
    "from qiskit import BasicAer\n",
    "from qiskit.tools.visualization import plot_histogram\n",
    "from qiskit.aqua import QuantumInstance\n",
    "from qiskit.aqua.algorithms import Grover\n",
    "from qiskit.aqua.components.oracles import LogicalExpressionOracle, TruthTableOracle"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Use Quantum Search to Find Solutions to 3-SAT Problems\n",
    "\n",
    "Let's look at an example 3-Satisfiability (3-SAT) problem and walkthrough how we can use Quantum Search to find its satisfying solutions. 3-SAT problems are usually expressed in [Conjunctive Normal Forms (CNF)](https://en.wikipedia.org/wiki/Conjunctive_normal_form) and written in the [DIMACS-CNF](https://www.satcompetition.org/2009/format-benchmarks2009.html) format. For example:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "input_3sat_instance = '''\n",
    "c example DIMACS-CNF 3-SAT\n",
    "p cnf 3 5\n",
    "-1 -2 -3 0\n",
    "1 -2 3 0\n",
    "1 2 -3 0\n",
    "1 -2 -3 0\n",
    "-1 2 3 0\n",
    "'''"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The CNF of this 3-SAT instance contains 3 variables and 5 clauses:\n",
    "\n",
    "$(\\neg v_1 \\vee \\neg v_2 \\vee \\neg v_3) \\wedge (v_1 \\vee \\neg v_2 \\vee v_3) \\wedge (v_1 \\vee v_2 \\vee \\neg v_3) \\wedge (v_1 \\vee \\neg v_2 \\vee \\neg v_3) \\wedge (\\neg v_1 \\vee v_2 \\vee v_3)$\n",
    "\n",
    "It can be verified that this 3-SAT problem instance has three satisfying solutions:\n",
    "\n",
    "$(v_1, v_2, v_3) = (T, F, T)$ or $(F, F, F)$ or $(T, T, F)$\n",
    "\n",
    "Or, expressed using the DIMACS notation:\n",
    "\n",
    "`1 -2 3`, or `-1 -2 -3`, or `1 2 -3`.\n",
    "\n",
    "With this example problem input, we then create the corresponding `oracle` for our `Grover` search. In particular, we use the `LogicalExpressionOracle` component provided by Aqua, which supports parsing DIMACS-CNF format strings and constructing the corresponding oracle circuit."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "oracle = LogicalExpressionOracle(input_3sat_instance)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `oracle` can now be used to create an Grover instance:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "grover = Grover(oracle)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can then configure the backend and run the Grover instance to get the result:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-1, -2, -3]\n"
     ]
    }
   ],
   "source": [
    "backend = BasicAer.get_backend('qasm_simulator')\n",
    "quantum_instance = QuantumInstance(backend, shots=1024)\n",
    "result = grover.run(quantum_instance)\n",
    "print(result['result'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As seen above, a satisfying solution to the specified 3-SAT problem is obtained. And it is indeed one of the three satisfying solutions.\n",
    "\n",
    "Since we used the `'qasm_simulator'`, the complete measurement result is also returned, as shown in the plot below, where it can be seen that the binary strings `000`, `011`, and `101` (note the bit order in each string), corresponding to the three satisfying solutions all have high probabilities associated with them."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAc0AAAFDCAYAAABY/1W1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3deXhV1fn3//dNAlGLVEABSVCGAGWSKRRpEZxwwJaqX4pYh1qnOmv71KHVx6+1WrW11gGnWvtzasVHrUK1IlgFRBEMKAoooAYlWEBBZRCCSe/fH2snPcQk7AM5E/m8risX5+y99ubeZ7r3Wnuttc3dERERke1rlukAREREcoWSpoiISExKmiIiIjEpaYqIiMSkpCkiIhKTkqaIiEhM+ZkOIJP23ntv79y5c6bDEBGRLDJv3rxP3X2futY16aTZuXNnSktLMx2GiIhkETP7sL51ap4VERGJSUlTREQkJiVNERGRmJQ0RUREYlLSFBERiUlJU0REJCYlTRERkZiUNEVERGJS0hQREYlJSVNERCQmJU0REZGYlDRFRERiUtIUERGJSUlTREQkJiVNERGRmJQ0RUREYlLSFBERiUlJU0REJCYlTRERkZiUNEVERGJS0hQREYlJSVNERCQmJc2dNGXKFHr27ElxcTE33njj19bfc8899OvXjwEDBjB8+HAWL15cs+6GG26guLiYnj178vzzz9cs79y5c802JSUlaTkOERHZPnP3TMeQMSUlJV5aWrrD21dVVdGjRw+mTZtGUVERQ4YM4dFHH6V37941ZdavX0+rVq0AmDx5MnfddRdTpkxh8eLFnHjiicydO5ePP/6Yww8/nKVLl5KXl0fnzp0pLS1l77333uljFBGR5JjZPHevs8aimuZOmDt3LsXFxXTt2pUWLVowfvx4Jk2atE2Z6oQJsGnTJswMgEmTJjF+/HgKCgro0qULxcXFzJ07N63xi4hIcpQ0d8LKlSvp1KlTzfOioiJWrlz5tXJ33nkn3bp147LLLuP222/f7rZmxhFHHMHgwYP505/+lOKjEBGRuJQ00+D888/n/fff56abbuK6667bbvlZs2Yxf/58nnvuOe68805mzpyZhihFRGR7lDR3QmFhIStWrKh5Xl5eTmFhYb3lx48fz9NPP73dbav/bdeuHccdd5yabUVEskTak6aZnWdmZWa2xczmmdlBDZQdaWavmtlaM9tsZu+a2S9qlTnLzF42s8/M7HMze8nMhqf+SGDIkCEsW7aMsrIytm7dysSJExkzZsw2ZZYtW1bz+Nlnn6V79+4AjBkzhokTJ1JRUUFZWRnLli3j29/+Nps2bWLDhg1AuAY6depU+vbtm47DERGR7chP539mZicAtwHnAbOif58zs97u/lEdm2wEbgfeBr4Evgvca2ZfuvtdUZmDgceAi6IyPwOeN7MB7r7s67tsPPn5+UyYMIEjjzySqqoqTj/9dPr06cPVV19NSUkJY8aMYcKECbzwwgs0b96c1q1b8+CDDwLQp08fxo0bR+/evcnPz+fOO+8kLy+P1atXc9xxxwFQWVnJj370I4466qhUHoaIiMSU1iEnZjYHeMvdz0pYtgx4wt1/GXMffwcq3P3EetYb8G/gene/o6F97eyQExER2fVkxZATM2sBDAam1lo1FfhOzH0MjMrOaKBYC2A34LMdCFNERKRe6Wye3RvIA1bXWr4aOLyhDc2sHNiHEO+v3f2eBopfR2jWnVzPvs4Gzgbo2LEj06dPB6Br167sueeeLFiwAIC2bdvSp0+fmp6r+fn5DB8+nPnz57N+/XoASkpKWL16dU2Hnu7du1NQUMDChQuB0JGnR48ezJo1C4CCggKGDRtGaWkpGzduBGDo0KGUl5fXDDfp2bMneXl5NTMHdejQgS5dujB79mwAdt99d4YOHcqcOXPYvHkzAMOGDaOsrIxVq1YB0Lt3b6qqqliyZAkQOhYVFRUxZ84cAFq2bElJSQmzZ8+moqICgOHDh7N06VLWrFkDQN++famoqKi5JtupUyfat29Pdc28VatWDBo0iFmzZlFZWQnAiBEjWLRoEWvXrgWgf//+bNiwgQ8++AAIMx21adOG+fPnA9C6dWv69+/PjBkzcHfMjJEjR7JgwQI++yyc8wwaNIh169axfPlyvU96n/Q+6X1Ky/vUkLQ1z5pZR2AlMNLdZyYsvxo4yd17NrBtF6AlcCBwE3Cxuz9cR7mLgd8Ah7v7drucqnlWRERqa6h5Np01zU+BKqB9reXtgVUNbejuZdHDt82sPXANsE3SNLNLCAnz6DgJU0REJFlpu6bp7luBecCoWqtGAa8msatmQEHiAjP7OSFhHuPus3YmThERkfqkdcgJcAvwsJnNBV4BzgE6AvcAmNlDAO5+avT8QqAMWBJtPwL4BVA93AQzuxS4HjgZWGpmHaJVm939i1QfkIiINB1pTZru/piZtQWuAvYFFgKj3f3DqMh+tTbJI1zD7AxUAu8DVxAl2cj5QHPCWM1EDwKnNWL4IiLSxOnWYOoIJCIiCbJinKaIiEiuU9IUkSZlypQp9OzZk+LiYm688cavrb/lllvo3bs3BxxwAIcddhgffvhhzbrLLruMPn360KtXLy666CKqW+quvPJKOnXqRMuWLdN2HJIZSpoi0mRUVVVx/vnn89xzz7F48WIeffTRmgH11QYOHEhpaSlvvfUWY8eO5bLLLgPg1Vdf5ZVXXuGtt95i4cKFvP7668yYESYn+/73v6+7ETURSpoi0mTMnTuX4uJiunbtSosWLRg/fjyTJk3apswhhxzCHnvsAcCBBx5IeXk5EG4Ov2XLFrZu3UpFRQVfffUV7du3rym37777pvdgJCPSPeRkl3TWrand/32XpHb/Ik3FypUr6dSpU83zxGnW6nL//fdz9NFHA2HatkMOOYR9990Xd+eCCy6gV69eKY9ZsouSpohIHR555BFKS0trmmDfe+893nnnnZqa56hRo3j55Zc56KB6bwksuyA1z4pIk1FYWFgz0ThAeXk5hYWFXyv3wgsvcP311zN58mQKCsIEZE899RQHHnggLVu2pGXLlhx99NE1E4pL06GkKSJNxpAhQ1i2bBllZWVs3bqViRMnMmbMmG3KvPHGG/z0pz9l8uTJtGvXrmb5fvvtx4wZM6isrOSrr75ixowZap5tgpQ0RaTJyM/PZ8KECRx55JH06tWLcePG0adPH66++momTw53E7z00kvZuHEjP/zhDxkwYEBNUh07dizdunWjX79+9O/fn/79+/P9738fCENRioqK+PLLLykqKuKaa67J1CFKimlGoEaYEUgdgUREdh2aEUhERKQRKGmKiIjEpKQpIiISk5KmiIhITEqaIhmwM5OGf/TRRxxxxBH06tWL3r17s3z5cgDcnSuvvJIePXrQq1cvbr/99nQdjkiToRmBRNKsetLwadOmUVRUxJAhQxgzZgy9e/euKVM9afgee+zB3XffzWWXXcZjj4X7rJ966qlceeWVjBo1io0bN9KsWTj3feCBB1ixYgXvvvsuzZo1Y82aNRk5PpFdmWqaImm2M5OGL168mMrKSkaNGgVAy5Yta8rdfffdXH311TVJNHFgvog0DiVNkTSra9LwlStX1ls+cdLwpUuXstdee3H88cczcOBALr30UqqqqgB4//33eeyxxygpKeHoo49m2bJlqT0QkSZISVMki1VPGn7ppZcCUFlZycsvv8zNN9/M66+/zgcffMADDzwAQEVFBbvtthulpaWcddZZnH766RmMXGTXpKQpkmY7M2l4UVERAwYMoGvXruTn53Pssccyf/78mnXHH388AMcddxxvvfVWGo5GpGlR0hRJs52ZNHzIkCF8/vnnfPLJJwC8+OKLNR2Ijj32WF566SUAZsyYQY8ePdJ0RCJNh3rPiqRZ4qThVVVVnH766TWThpeUlDBmzJhtJg2HcIeNyZMnk5eXx80338xhhx2GuzN48GDOOussAK644gpOOukk/vjHP9KyZUv+/Oc/Z/IwRXZJmrBdE7aLNDmp/M7q+5r7NGG7iIhII1DSFBERiUlJU0REJCYlTRERkZiUNEVERGJS0hQREYlJSVNERCQmJU0REZGYlDRFRERiUtIUERGJSUlTREQkJk3YLpIhmrNYJPeopikiIhKTkqaIiEhMSpoiIiIxKWmKiIjEpKQpIiISk5KmiIhITEqaIiIiMSlpioiIxKSkKSIiEpOSpoiISExKmiIiIjEpaYqIiMSkpCkiIhJT2pOmmZ1nZmVmtsXM5pnZQQ2UPd7MpprZJ2a2wczmmNmYBsqfaGZuZs+kJnoREWnK0po0zewE4Dbgt8BA4FXgOTPbr55NRgIvAsdE5f8JPFVXojWzrsDvgZdTELqIiEjaa5o/Bx5w9/vc/R13vxD4N3BuXYXd/WJ3v9Hd57r7e+7+a2AecGxiOTNrDjwKXAl8kNpDEBGRpiptSdPMWgCDgam1Vk0FvpPErvYEPqu17Hpgubs/uOMRioiINCw/jf/X3kAesLrW8tXA4XF2YGbnA0XAwwnLjgDGAQMaJ0wREZG6pTNp7hQz+x/CNcsT3P3DaNk+wAPAie7+ecz9nA2cDdCxY0emT58OQNeuXdlzzz1ZsGABAG3btqVPnz7MnDkTgPz8fIYPH878+fNZv349ACUlJaxevRro1liHWaeKigpmz54NwO67787QoUOZM2cOmzdvBmDYsGGUlZWxatUqAHr37k1VVRVLliwBoLCwkKKiIubMmQNAy5YtKSkpYfbs2VRUVAAwfPhwli5dypo1awDo27cvFRUVLFu2DIBOnTrRvn17SktLAWjVqhWDBg1i1qxZVFZWAjBixAgWLVrE2rVrAejfvz8bNmzggw9Ci3nnzp1p06YN8+fPB6B169b079+fGTNm4O6YGSNHjmTBggV89lloTBg0aBDr1q1j+fLlwM69TytWrACge/fuFBQUsHDhQgDatWtHjx49mDVrFgAFBQUMGzaM0tJSNm7cCMDQoUMpLy9n5cqVAPTs2ZO8vDwWL14MQIcOHejSpUtS7xMcnNTnIFnTp0/X+1TP+wQFKXjFg+nTp+v7lIHvU2P+7jXE3L3BAo0lap79kpDgHk9YfifQ191HNrDtWOAh4FR3fyJh+cHAS0BVQvHqJuf/AH3cfUl9+y0pKfHqD+3OOOvWnd5Fg+67JLX7l8zQ5yZzUvna63XPfWY2z91L6lqX1DVNMxsXNYdWP7/azMrN7Hkz27ehbd19K6ETz6haq0YRetHW+38SmmNPS0yYkdeBfoSm2eq/yYQetAOAslgHJiIiEkOyHYGuqX5gZoOAXwG3A82BP8TY/hbgNDM708x6mdltQEfgnmifD5nZQwn/x3jgr8AVwEwz6xD9tQFw903uvjDxD/gc2BA935rk8YmIiNQr2Wua+wPVzZ3HAU+7++/MbCrw/PY2dvfHzKwtcBWwL7AQGF19jRKoPV7znCjGW6O/ajNI9QUhERGRWpJNmlsIQz4ADgP+Ej3+ImF5g9z9LuCuetYd3NDzmPs/LdltRERE4kg2ab4M/MHMZgElwNhoeQ9gRWMGJiIikm2SvaZ5AbCVkCzPcfePo+VHE6N5VkREJJclVdN093Lg+3UsVydrERHZ5SU9jZ6Z7WZmY83scjPbK1rWrbpHq4iIyK4qqZqmmRUDLwAtgb2AxwlDPM6Nnp/Z2AGKiIhki2RrmrcSJlhvD2xOWD4ZOKSxghIREclGyfae/Q5woLtXmVni8o8IkxSIiIjssnbk1mDN61i2H2GspoiIyC4r2aQ5lXAj6WpuZq2AXwPPNlpUIiIiWSjZ5tmfAy+Z2RJgN+AxoJhwT8xxjRybiIhIVkl2nObHZjYAOBEYRKip/gn4q7tvbnBjERGRHJf0Taij5PgX/jvvrIiISJOw3aRpZscD/3D3r6LH9XL3vzdaZCIiIlkmTk3zCaADsCZ6XB8H8hojKBERkWy03aTp7s3qeiwiItLUJJUEzWyEmX0t0ZpZnpmNaLywREREsk+yNceXgLomZt8rWiciIrLLSjZpGuHaZW1tgU07H46IiEj2ijXkxMwmRw8deMTMKhJW5wF9gVcbOTYREZGsEnec5troXwM+Y9s7nGwFZgH3NWJcIiIiWSdW0nT3nwCY2XLgZndXU6yIiDQ5yU6j9+tUBSIiIpLt4swI9BYw0t0/M7O3qbsjEADufkBjBiciIpJN4tQ0nwSqO/40NCOQiIjILi3OjEC/ruuxiIhIU6Np8URERGKKc02zweuYiXRNU0REdmVx73IiIiLS5CV1TVNERKQp0zVNERGRmDROU0REJCaN0xQREYlJ4zRFRERiSmru2Wpm1g3oFT19x93fb7yQREREslNSSdPM2gL3A2OA//x3sT0DnO7ua+vdWEREJMcl23v2z0AxcBCwW/Q3AuiC7qcpIiK7uGSbZ48EDnP32QnLXjGznwIvNF5YIiIi2SfZmuYnQF03oP4SUNOsiIjs0pJNmtcCt5pZYfWC6PEfonUiIiK7rB2ZsL0LsNzMVkbPC4EtQDvCNU8REZFdkiZsFxERiUkTtouIiMSkCdtFRERiSippmlkLM/u1mS01sy1mVpX4l6ogRUREskGyNc3fAD8m9Jb9D3ApcCdhuMl5jRuaiIhIdkk2aY4DznH3e4EqYJK7XwT8LzCqsYMTERHJJskmzfbA4ujxRmCv6PEU4IjGCkpERCQbJZs0PwI6Ro/fI0yrBzAM2NxYQYmIiGSjZJPmU8Bh0ePbgF+bWRnwAJrYQEREdnFJJU13/6W7Xx89foJwt5M7gOPd/co4+zCz88ysLOp9O8/MDmqg7L5m9jczezfqoftAPeVamdntZvaxmVWY2XtmNi6ZYxMREdmeHboJdTV3fw14LW55MzuBUEM9D5gV/fucmfV294/q2KQA+BS4ETi7nn02B6YB6wgdlcqBIqAi/pGIiIhsX9JJ08wGAZcAvaNF7wB/dPf5MTb/OfCAu1ffe/NCMzsKOBf4Ze3C7r4cuCj6f8fWs8+fAPsAB7n71mjZ8hixiIiIJCXZyQ1OAl4H9gX+Gf21B+aa2cnb2bYFMBiYWmvVVOA7ycRRy7HAK8AdZrbKzBab2TVRDVRERKTRJFvTvB74v+7+28SFZvZL4DrgkQa23RvIA1bXWr4aODzJOBJ1BQ4F/gYcA3QmTLjQEvhF7cJmdjZRU2/Hjh2ZPn162EnXruy5554sWLAAgLZt29KnTx9mzpwJQH5+PsOHD2f+/PmsX78egJKSElavXg1024nwt6+iooLZs8N9v3fffXeGDh3KnDlz2Lw5dFgeNmwYZWVlrFq1CoDevXtTVVXFkiVLACgsLKSoqIg5c+YA0LJlS0pKSpg9ezYVFaEVe/jw4SxdupQ1a9YA0LdvXyoqKli2bBkAnTp1on379pSWlgLQqlUrBg0axKxZs6isrARgxIgRLFq0iLVrw61V+/fvz4YNG/jggw8A6Ny5M23atGH+/NAo0bp1a/r378+MGTNwd8yMkSNHsmDBAj777DMABg0axLp161i+fDmwc+/TihUrAOjevTsFBQUsXLgQgHbt2tGjRw9mzZoFQEFBAcOGDaO0tJSNGzcCMHToUMrLy1m5Mtzcp2fPnuTl5bF4cRiB1aFDB7p06ZLU+wQHJ/U5SNb06dP1PtXzPoUrP6kxffp0fZ8y8H1qzN+9hpi7N1hgm8Jmm4D+7v5ereXFwFvuvkcD23YEVgIj3X1mwvKrgZPcved2/u9ngE/d/bRay5cCuwFd3L0qWnY28EegpTdwgCUlJV79od0ZZ92607to0H2XpHb/khn63GROKl97ve65z8zmuXtJXeuSHXLyEnWfHh8MzNjOtp8SZhFqX2t5e2DV14vH9m9gaXXCjLwD7EGo3YqIiDSKODehPj7h6XPADWZWwn97zR4IHA9c09B+3H2rmc0jTLf3eMKqUcCTScRc2yvAj8ysmbv/J1rWA/iSkKhFREQaxY7ehLrmumCCO4C7trOvW4CHzWwuIdmdQ5hh6B4AM3sIwN1Prd7AzAZED1sB/4meb3X36un87gYuAG4zswmEa5q/Bu5qqGlWREQkWXFuQt1o99x098fMrC1wFaEH7kJgtLt/GBXZr47N3qj1/PvAh4TkiLuvMLMjCAn5TUJT718IHZNEREQazU5NbrAj3P0u6qmRuvvBdSyzGPt8jZ0btiIiIrJdSdcizewYM5tpZp+a2SdmNsPMRqciOBERkWyS7OQGZxImbX8fuBy4AigDnjKz0xs/PBERkeyRbPPs5cDP3X1CwrL7o16xVxCuJYqIiOySkm2e3Y9ww+nangP23/lwREREsteO3IR6VB3LjyD0aBUREdllJds8ezNhYvRBwKvRsu8CpwAXNmZgIiIi2SappOnu95rZGuD/EGYBgjBl3Th3n9TYwYmIiGST2EnTzPIJzbAz3f2p1IUkIiKSnWJf03T3SuDvwJ6pC0dERCR7JdsRaAFQnIpAREREsl2ySfMa4A9mdqyZdTKzNol/KYhPREQkayTbe/bZ6N+/A4l3ELHoeV5jBCUiIpKNkk2ah6QkChERkRwQK2ma2R7A74FjgebAC8BF7q6bPIuISJMR95rmr4HTCM2zjxJmBbo7RTGJiIhkpbjNs8cDZ7j7RAAz+yvwipnluXtVyqITERHJInFrmp2Al6ufuPtcoBLomIqgREREslHcpJkHbK21rJLkOxKJiIjkrLhJz4BHzKwiYdluwH1m9mX1Ancf05jBiYiIZJO4SfPBOpY90piBiIiIZLtYSdPdf5LqQERERLJdstPoiYiINFlKmiIiIjEpaYqIiMSkpCkiIhKTkqaIiEhMSpoiIiIxKWmKiIjEpKQpIiISk5KmiIhITEqaIiIiMSlpioiIxKSkKSIiEpOSpoiISExKmiIiIjEpaYqIiMSkpCkiIhKTkqaIiEhMSpoiIiIxKWmKiIjEpKQpIiISk5KmiIhITEqaIiIiMSlpioiIxKSkKSIiEpOSpoiISExKmiIiIjEpaYqIiMSU9qRpZueZWZmZbTGzeWZ20HbKj4zKbTGzD8zsnFrr88zsNwn7LDOz68wsP7VHIiIiTU1ak6aZnQDcBvwWGAi8CjxnZvvVU74L8M+o3EDgBuAOM/ufhGKXA+cDFwHfAi6Onv8yRYchIiJNVLprYz8HHnD3+6LnF5rZUcC51J3kzgE+dvcLo+fvmNlQ4BfAk9Gy7wD/cPd/RM+Xm9lkYGhKjkBERJqstNU0zawFMBiYWmvVVELiq8uwOso/D5SYWfPo+SzgEDP7VvT/9AYOJdRQRUREGk06m2f3BvKA1bWWrwY61LNNh3rK50f7A7gJeBhYbGZfAYuAB939rsYIWkREpNqu0FnmBOBU4EeEhDkAuM3Mytz9/tqFzexs4GyAjh07Mn36dAC6du3KnnvuyYIFCwBo27Ytffr0YebMmQDk5+czfPhw5s+fz/r16wEoKSlh9erVQLeUHmBFRQWzZ88GYPfdd2fo0KHMmTOHzZs3AzBs2DDKyspYtWoVAL1796aqqoolS5YAUFhYSFFREXPmzAGgZcuWlJSUMHv2bCoqKgAYPnw4S5cuZc2aNQD07duXiooKli1bBkCnTp1o3749paWlALRq1YpBgwYxa9YsKisrARgxYgSLFi1i7dq1APTv358NGzbwwQcfANC5c2fatGnD/PnzAWjdujX9+/dnxowZuDtmxsiRI1mwYAGfffYZAIMGDWLdunUsX74c2Ln3acWKFQB0796dgoICFi5cCEC7du3o0aMHs2bNAqCgoIBhw4ZRWlrKxo0bARg6dCjl5eWsXLkSgJ49e5KXl8fixYsB6NChA126dEnqfYKDk/ocJGv69Ol6n+p5n6AgBa94MH36dH2fMvB9aszfvYaYuzdYoLFEzbNfAie6++MJy+8E+rr7yDq2mQm87e7nJyz7IfA3YA93/8rMVgA3u/ttCWWuAk5z9+KGYiopKfHqD+3OOOvWnd5Fg+67JLX7l8zQ5yZzUvna63XPfWY2z91L6lqXtuZZd98KzANG1Vo1itA7ti6z6ylf6u5fRc/3AKpqlalCY1BFRKSRpbt59hbgYTObC7xC6B3bEbgHwMweAnD3U6Py9wAXmNmtwL3Ad4HTgBMT9vkP4AozKyM0zw4k9NJ9KNUHIyIiTUtak6a7P2ZmbYGrgH2BhcBod/8wKrJfrfJlZjYa+CNhWMrHwEXu/mRCsQuB3wB3Ae2AfwP3Adem8lhERKTpSXtHoKhXa509W9394DqWzQAGNbC/DcAl0Z+IiEjK6LqfiIhITEqaIiIiMSlpioiIxKSkKSIiEpOSpoiISExKmiIiIjEpaYqIiMSkpCkiIhKTkqaIiEhMSpoiIiIxKWmKiIjEpKQpIiISk5KmiIhITEqaIiIiMSlpioiIxKSkKSIiaTFlyhR69uxJcXExN95449fWV1RUcMIJJ1BcXMzQoUNZvnw5AHPnzmXAgAEMGDCA/v3789RTT9Vs8/nnnzN27Fi+9a1v0atXL2bPnp3SY1DSlJyVii8gQFVVFQMHDuR73/teOg5DpEmoqqri/PPP57nnnmPx4sU8+uijLF68eJsy999/P61bt+a9997jZz/7GZdffjkAffv2pbS0lDfffJMpU6bw05/+lMrKSgAuvvhijjrqKN59910WLFhAr169UnocSpqSk1L1BQS47bbbUv7FE2lq5s6dS3FxMV27dqVFixaMHz+eSZMmbVNm0qRJ/PjHPwZg7Nix/Otf/8Ld2WOPPcjPzwdgy5YtmBkAX3zxBTNnzuSMM84AoEWLFuy1114pPQ4lTclJqfgCApSXl/Pss89y5plnpu9gRJqAlStX0qlTp5rnRUVFrFy5st4y+fn5fPOb32Tt2rUAzJkzhz59+tCvXz/uuece8vPzKSsrY5999uEnP/kJAwcO5Mwzz2TTpk0pPQ4lTclJqfgCAlxyySX87ne/o1kzfTUk+6TiksT29pkthg4dyqJFi3j99de54YYb2LJlC5WVlcyfP59zzz2XN954g2984xspPwb9MkiTVNcX8JlnnqFdu3YMHjw40+GJfE0qLknE2WdjKSwsZMWKFTXPy8vLKSwsrLdMZQoZn/cAABTQSURBVGUlX3zxBW3btt2mTK9evWjZsiULFy6kqKiIoqIihg4dCoQWpfnz56ck/mpKmpKTUvEFfOWVV5g8eTKdO3dm/PjxvPjii5x88smpP5gctKM1nmnTpjF48GD69evH4MGDefHFF2u2efTRR+nXrx8HHHAARx11FJ9++mm6DicnpOKSRJx9NpYhQ4awbNkyysrK2Lp1KxMnTmTMmDHblBkzZgwPPvggAE888QSHHnooZkZZWVlNv4MPP/yQd999l86dO9OhQwc6derEkiVLAPjXv/5F7969UxJ/NSVNyUmp+ALecMMNlJeXs3z5ciZOnMihhx7KI488kvZjy3Y7U+PZe++9+cc//sHbb7/Ngw8+yCmnnAKEk5qLL76Yl156ibfeeosDDjiACRMmpP3YslkqLknE2Wdjyc/PZ8KECRx55JH06tWLcePG0adPH66++momT54MwBlnnMHatWspLi7mlltuqTkhmzVrFv3792fAgAEcd9xx3HXXXey9994A3HHHHZx00kkccMABvPnmm/zqV79KSfw1x5HSvYukSOIXsKqqitNPP73mC1hSUsKYMWM444wzOOWUUyguLqZNmzZMnDgRCF/AG2+8kebNm9OsWbNtvoCyfYm1E6CmdpJ4hj9p0iSuueYaINR4LrjgAtydgQMH1pTp06cPmzdvpqKigmbNmuHubNq0ibZt27J+/XqKi4vTely7uupLEu+88w4//vGPOfroo9Mew+jRoxk9evQ2y6699tqax7vtthuPP/7417Y75ZRTak6wahswYAClpaWNG2gDlDQlZ6XiC1jt4IMP5uCDD26UOHc1ddVO5syZU2+ZxBpP4snJk08+yaBBgygoKADg7rvvpl+/fnzjG9+ge/fu3HnnnWk4mtyRzCWJoqKiWJck4uxTtqXmWRFJu0WLFnH55Zdz7733AvDVV19x991388Ybb/Dxxx9zwAEHcMMNN2Q4yuySiksScfYp21JNU0SSsrM1nvLyco477jgeeughunXrBsCbb74JUPN83LhxWT38IRNSdUmirn2mylm3pmzXANx3SWr3D0qaIpKkxNpJYWEhEydO5G9/+9s2ZaprPMOGDdumxvP5559zzDHHcOONN/Ld7363pnxhYSGLFy/mk08+YZ999mHatGmalakOqbgkUdc+pX5Kmk3clClTuPjii6mqquLMM8/kiiuu2GZ9RUUFp556KvPmzaNt27Y89thjdO7cmWnTpnHFFVewdetWWrRowe9//3sOPfRQAObNm8dpp53G5s2bGT16NLfddts2s+40plSeuabjrDUX7UyNZ8KECbz33ntce+21NT/2U6dOpWPHjvzv//4vI0aMoHnz5uy///488MADGTxKkbopaTZh1UMHpk2bRlFREUOGDGHMmDHb9IJMHDowceJELr/8ch577LGaoQMdO3Zk4cKFHHnkkTVd1c8991zuu+8+hg4dyujRo5kyZUpGeupJ6uxojeeqq67iqquuqnOf55xzDuecc07jBirSyJQ0m7BUDB1Yt24d69ev58ADDwTg1FNP5emnn1bSFGkku8J1wVym3rNN2M4Olq6WOHRg5cqVFBUVNbhPEZFcpZqm7JTqoQNTp07NdCiSRqrtSFOlmmYTtrPzt9Y1dKCwsJDy8vIG9ykikquUNJuwnRksXd/QgX333ZdWrVrx2muv4e489NBD/OAHP0jrcYmIpIqSZhO2MxMoJw4dqL5P35o1awC46667OPPMMykuLqZbt27qBCQiuwxd02ziUjF0oKSkhIULFzZuoCIiWUA1TRERkZhU02zi1AtSRCQ+1TRFRERiUtIUERGJSUlTREQkJiVNERGRmJQ0RUREYlLSFBERiUlJU0REJCYlTRERkZiUNEVERGJKe9I0s/PMrMzMtpjZPDM7aDvlR0bltpjZB2Z2zs7uU0REZEekNWma2QnAbcBvgYHAq8BzZrZfPeW7AP+Myg0EbgDuMLP/2dF9ioiI7Kh01zR/Djzg7ve5+zvufiHwb+DcesqfA3zs7hdG5e8DHgR+sRP7FBER2SFpS5pm1gIYDEyttWoq8J16NhtW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\n",
      "text/plain": [
       "<Figure size 504x360 with 1 Axes>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plot_histogram(result['measurement'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Quantum Search with Arbitrary Boolean Logical Expressions\n",
    "\n",
    "Aqua's `Grover` can also be used to perform Quantum Search on `Oracle` constructed from means in addition to DIMACS. For example, the `LogicalExpressionOracle` can actually be configured using arbitrary Boolean logical expressions, as demonstrated below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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gH79+rF582aWLAmbsHPnzrRr147S0lIAWrRoQXFxMTNmzKCiogKAYcOGsXDhQtauXQtA//79Wb9+PcuWLQOga9eutG7dmrlz5wLQqlUr+vfvz7Rp03B3zIzhw4czf/581q1bB0BxcTEff/wx5eXl+pz0OelzytPPCToS19SpU/P+c9oZc/fY/2wmzKwDsBIY7u7TE+aPB8509967eP3TwBp3/94u1isA5gEvu/slO1u3pKTEq760IiKSnh/eGn/dey/LXTmyxczmuHtJTcvq8prmGqASaJc0vx2QtWuQ7l4JlAIHZyumiIgI1GHSdPctwBzg2KRFxxJa0WaFmRlwGKGBkYiISNbU5TVNgJuBiWY2G3gVuADoANwNYGb3A7j72VUvMLMB0cMWwLbo+RZ3XxQtvwZ4HVgSrXMJIWnW2CJXREQkXXWaNN39YTNrA1xF6E+5ADje3d+PVqmpv+abSc9PAt4HukbPWwL3AO2BT6L1h7n77OyWXkRE9nZ1faaJu98F3FXLsqNqmGe7iHc5cHlWCiciIrITGntWREQkJiVNERGRmJQ0RUREYlLSFBERiUlJU0REJCYlTRERkZiUNEVERGJS0hQREYlJSVNERCQmJU0REZGYlDRFRERiUtIUERGJSUlTREQkJiVNERGRmJQ0RUREYlLSFBERiUlJU0REJCYlTRERkZiUNEVERGJS0hQREYlJSVNERCQmJU0REZGYlDRFRERiUtIUERGJSUlTREQkJiVNERGRmJQ0RUREYlLSFBERiUlJU0REJCYlTRERkZiUNEVERGJS0hQREYlJSVNERCQmJU3JS5MnT6Z379707NmTG264YYflmzdvZvTo0fTs2ZPBgwdTXl6+3fJ///vfNGvWjJtuuql63n//+19OPfVUDjnkEPr06cPMmTNz/W+IyB5GSVPyTmVlJRdffDHPPfccixYt4sEHH2TRokXbrfOnP/2JVq1a8d5773H55Zczbty47ZaPHTuWb3zjG9vNu/TSS/n617/OO++8w/z58+nTp0/O/xcR2bMoaUremT17Nj179qR79+40atSI73znO0yaNGm7dSZNmsQ555wDwKmnnsqLL76IuwPw5JNP0q1bN4qKiqrX/+STT5g+fTpjxowBoFGjRrRs2bKO/iOpb7Jd07F8+XKOPvpo+vbtS1FREbfddpvKXU8paUreWblyJZ07d65+3qlTJ1auXFnrOoWFhey3336sXbuWDRs28Otf/5prrrlmu/XLyso44IAD+P73v0+PHj1o2bIlPXr0yFrV7652VlJ/5KKmo7CwkN/+9rcsWrSI119/nTvvvHOHmHtruesbJc2Y0j2Cmz17NgMGDGDAgAH079+fv//979Wvue222+jXrx9FRUXceuut9abct9xyC0VFRfTr14/TTz+dTZs25aTs6ZgwYQKXX345zZo1225+RUUFc+fO5bzzzgPgW9/6FqNHj87KjiXOzmpvVR9/N7mo6TjwwAMpLi4GoHnz5vTp02eHA8G9tdz1jZJmDJkcwfXr14/S0lLmzZvH5MmTOf/886moqGDBggXce++9zJ49mxtvvJGf//znHHTQQVnZsSxevLh63je/+U1WrlzJBRdckJVyr1y5kttvv53S0lIWLFhAZWUlDz30UFa3d8eOHVm+fHn18xUrVtCxY8da16moqOCTTz6hTZs2zJo1i5/85Cd07dqVW2+9leuvv5477riDTp060alTJ8yMnj17MmbMGObPn5+VHUucndXeKNe/m/nz5/P000/z3nvvZbXcuajpSFReXs6bb77J4MGDVe56SEkzhkyO4PbZZx8KCwsB2LRpE2YGwNtvv83gwYNp3Lgxl1xyCeeddx7nn39+VnYsvXv3Zt68edx9990MHz6cZs2acdppp2Wl3BCS1MaNG6moqODzzz+nQ4cO2drUAAwaNIglS5ZQVlbGli1beOihhxg5cuR264wcOZK//vWvADz22GN89atfxcx45ZVXKC8vp7y8nMsuu4wrr7ySH/3oR7Rv357OnTsze/ZsOnfuzIsvvkjfvn2zsmNJXH/y5Mncfvvt3HDDDVk7s+ratSuHHnooAwYMoKSkJLONW4dy+bupWj58+HCeeOKJuv3HdqK2mo4qGzZs4Nvf/ja33norLVq0qOPS1a6+lnt3UNKMIZMjOIBZs2ZRVFTEoYceyt13301hYSH9+vXjlVde4fnnn6dbt268/vrrfPDBB1lLbFVlKigooEePHhx00EFZKXfHjh254oor6NKlCwceeCD77bcfI0aMyGj7JissLOSOO+7guOOOo0+fPowaNYqioiLGjx/PU089BcCYMWNYu3YtPXv25Oabb451HfF3v/sdt99+O0888QTz5s3jyiuvTKlcu9qxVJ1ZXXHFFZxxxhlZOQCq8vLLLzNv3jxKS0tTKvPulMvfzdq1a/n888959tlnt6uVyIZc1HQAbN26lW9/+9sMHDiQn/3sZ1mrst60aRNf+tKX+OlPf8pDDz1UfVCX7XKfeeaZnHLKKZlu3npPSbMODB48mIULF/LGG2/wq1/9ik2bNtGnTx/GjRvHRRddxIIFCxgwYAAFBQVZ2bEkWrp0KaeffnrWyr1u3TomTZpEWVkZf/nLX5g0aRLt2rXL2llV1TWwSy65hHPPPZelS5fy85//HIDrrruu+oyzSZMmPProo7z33nvMnj2b7t277/D+EyZM4Iorrqh+PmDAAB544AEGDRrEk08+SatWrbKyY6lav+rMasuWLXTp0iWrB0C5lIvrjueeey5jxozh8ccfT7tcO/vdjBgxgq9//evVv5tsykVNh7szZswYevfuzYsvvpjVKuvGjRvz0ksv8c4779C2bVsmTZrEK6+8ktVy9+nTh7Fjx2Z1O9dXSpoxZHLkmahPnz40a9aMBQsWAOFs6cYbb+TEE0+kVatW9OrVK+Wy1bRjqdK2bVvKy8s57bTTslbuF154gW7dutG6dWsuvfRSJkyYwLe+9a2s/PjrokFNLnaIVTHnzp1Lx44dq2Nm6wDIzBgxYgQDBw7knnvuyer2yMV1R4Dvfe973HbbbWzdurU6TjZ/N3PmzOHKK6/kkUce4W9/+1tKyf75559n4MCBHHrooQwcOJCXXnqp+jUPP/wwxcXFVFRUMHDgwKzVdLz66qtMnDiRZ555htWrV3PKKafwwgsvZOXAysxo1qwZhYWF3HTTTbzzzjucfvrpWS33Sy+9VH2A9Oyzz+70NelI98BtV5/lYYcdRlFR0Q6N+TLi7nvtNHDgQI9j69at3q1bN1+2bJlv3rzZDzvsMF+wYMF269xxxx1+/vnnu7v7gw8+6Keddpq7uy9btsy3bt3q7u7l5eV+4IEH+kcffeTu7qtWrfLXXnvNhw0b5r179/Z169b59ddf79dff/12sUeMGOGvvfZadVnatGnj27Zt26GcRx99tL/xxhvVzx9//HFv2rRpVsv9+uuve9++ff2ll17yESNG+Nlnn+2333572uVetmyZt23b1rdu3eqvvfaajxgxonpZTTGz4ZlnnvGDDz7Yu3fv7r/4xS/c3f3qq6/2SZMmubv7xo0b/dRTT/UePXr4oEGDfOnSpTvEuOaaa/w3v/nNdjHbt2/vzZs3r455//33+8UXX7zd64qKinz58uXVz7t37179faiyaNEiHzRokG/cuNHd3VesWOHu4fty2GGH+bRp0zLdBNXibPNUP8cqS5Ys8YYNG+bkd1NRUeFdunTxbt26VW+XhQsXbhf7zjvv3C72qFGj3N197ty5vnLlSnd3f+utt7xDhw7u7r5mzRrv3Lmzr1692t3dzz77bH/hhRfib8wYHn30UR8zZkz181S/I1W/v3333defeOKJ6nUqKiq8f//+vu+++/pPfvKTrJY5jh/cEn9KVlFR4d27d/elSyEAvAQAABvuSURBVJdWf09292cJlHoteWO3J67dOcVNmu7p72jvv/9+79u3r/fv398PP/xw//vf/14dc+jQoX7IIYd4o0aNfOLEiVndsbi7jx492i+77LKsl3v8+PHeoUMHb9mypX/3u9/1TZs2ZeXHH2eH4p7ZDzSXspWA3Hc8AHruuee8V69e3qpVK//GN76xw/qbNm3yUaNGeY8ePfxLX/qSl5WVubv7lClTvLi42Pv16+fFxcX+4osvbve6Rx991Lt06eJFRUXunr2duLt7WVmZd+nSJSe/m4MOOsibNWtWvSNMd1tv27bNW7Vq5Zs2bfLZs2f7V7/61epl999/v1944YU7bOtMZJo0qyQfWFVZt26dH3XUUf7WW29ltdy7kslvMlu/m2x+ljtLmoW7OhOV4Pjjj+f444/fbt51111X/bjqGluys846i7POOqvGmK+88goAzz77LJdddhnXXHMN5557bnWVSklJCSNHjmTMmDGcddZZ9OzZk9atW1d38ZgxYwY33HADDRs2pEGDBtx1113sv//+AHz22Wc8//zzLFu2jFtuuSWr5b722ms59NBDmTx5Mn/84x9rXGdXqqqV3377bc4555wdhryrjxKrfquqaf/v//5vu3Wqqn6HDBmyXdVvWVkZnTt3prCwkPfff5933nmHrl278tlnn7F161YuvvhiJk2axA9+8APeeecdFi1aRN++favjJlahPvTQQ4wbN46HH36Y/fffn3/84x906NCBBQsWcNxxx21XZTxr1qwdroOnoqbPsUmTJtXLmzdvXl2tWiUbv5vHHnuMyZMnc8wxxwChkdGsWbO2W6+2qvCq3wjA448/TnFxMY0bN6Znz54sXryY8vJyOnXqxJNP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\n",
      "text/plain": [
       "<Figure size 504x360 with 1 Axes>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expression = '(w ^ x) & ~(y ^ z) & (x & y & z)'\n",
    "oracle = LogicalExpressionOracle(expression)\n",
    "grover = Grover(oracle)\n",
    "result = grover.run(QuantumInstance(BasicAer.get_backend('qasm_simulator'), shots=1024))\n",
    "plot_histogram(result['measurement'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In the example above, the input Boolean logical expression `'(w ^ x) & ~(y ^ z) & (x & y & z)'` should be quite self-explanatory, where `^`, `~`, and `&` represent the Boolean logical XOR, NOT, and AND operators, respectively. It should be quite easy to figure out the satisfying solution by examining its parts: `w ^ x` calls for `w` and `x` taking different values; `~(y ^ z)` requires `y` and `z` be the same; `x & y & z` dictates all three to be `True`. Putting these together, we get the satisfying solution `(w, x, y, z) = (False, True, True, True)`, which our `Grover`'s result agrees with."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Quantum Search with Oracles from TruthTable\n",
    "\n",
    "With Aqua, `Oracle`s can also be constructed from truth tables, meaning we can also perform Quantum Search on truth tables. Even though this might seem like a moot point as we would be essentially searching for entries of a truth table with the $1$ value, it'd a good example for demonstrative purpose."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "truthtable = '1000000000000001'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As shown, the `truthtable` is specified with a bitstring containing values of all entries in the table. It has length $16$, so the corresponding truth table is of $4$ input bits. Since the very first and last values are $1$, the corresponding truth table target entries are `0000` and `1111`.\n",
    "\n",
    "Next, we can setup the `Oracle` and `Grover` objects to perform Quantum Search as usual."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcQAAAFLCAYAAABIufwSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3de3xV1Zn/8c9DwkUElItySZCIARRQNMYCNnJpdbCgWBnv/rSOthavtdap7agUta06Yx2dKmqpiloG8FbxilStIIogoIxABRSwJHJRQAGFxITn98faiYdDEnJuIYHv+/Xar5yzzz7PXtnnnP3svfZaa5u7IyIisq9rsqcLICIi0hAoIYqIiKCEKCIiAighioiIAEqIIiIigBKiiIgIANl7ugCZ0qFDB8/Ly9vTxRARkQZk/vz5n7v7QdW9ttcmxLy8PObNm7eniyEiIg2ImX1S02uqMhUREUEJUUREBFBCFBERAZQQRUREACVEERERQAlRREQEUEIUEREBlBBFREQAJUQRERFACVFERARQQhQREQGUEEVERAAlRBEREUAJUUREBFBCFBERAZQQRUREACVEERERQAlRREQEUEIUEREBlBBFREQAJUQRERFACVFERARQQgRg2rRp9OrVi/z8fG6//fYal3v66acxM+bNmwfAhg0bGDp0KK1ateLKK6/cadn58+dz5JFHkp+fz9VXX427Z/R/EBGR1OzzCbGiooIrrriCl19+mSVLljBp0iSWLFmyy3JbtmzhnnvuoX///lXzWrRowa233sqdd965y/KXXXYZ48ePZ/ny5Sxfvpxp06Zl9P8QEZHU7PMJce7cueTn59O9e3eaNWvGOeecw9SpU3dZ7qabbuL666+nRYsWVfP2339/ioqKdpoHsGbNGjZv3syAAQMwMy688EKeffbZjP8vIiKSvH0+IZaUlNC1a9eq57m5uZSUlOy0zIIFC1i9ejUjRoyoc8zc3NxaY4qISMOSvacL0NDt2LGDa6+9lgkTJuzpooiISAbt82eIOTk5rF69uup5cXExOTk5Vc+3bNnCokWLGDJkCHl5ebzzzjuMHDmyqmFNTTGLi4trjCkiIg3PPp8QjzvuOJYvX87KlSspKytj8uTJjBw5sur1Aw44gM8//5xVq1axatUqBgwYwHPPPUdhYWGNMTt37kybNm145513cHcee+wxTjvttPr4d0REJEn7fJVpdnY29957L8OGDaOiooKLL76YPn36MGbMGAoLC3dKjtXJy8tj8+bNlJWV8eyzzzJ9+nR69+7NuHHjuOiii9i2bRs/+MEP+MEPflBP/5GIiCTD9tb+cYWFhV5btaaIiOx7zGy+u1dbxbfPV5mKiIiAEqKIiAighCgiIgIoIYqIiABKiCIiIoASooiICKCEKCIiAighioiIAEqIIiIigBKiiIgIoIQoIiIZNG3aNHr16kV+fj633377Lq8/8MADHHnkkRx99NEUFRWxZMkSACZOnMjRRx9dNTVp0oT3338fgEmTJnHkkUdy1FFHcfLJJ/P555+npaway1RERDKioqKCnj178re//Y3c3FyOO+44Jk2aRO/evauW2bx5M23atAHgueeeY9y4cUybNm2nOB988AE//OEP+fjjjykvL6dLly4sWbKEDh068Mtf/pKWLVsyduzYOpWptrFM9/m7XezOT+5ObPnx12SmHCIijc3cuXPJz8+ne/fuAJxzzjlMnTp1p4RYmQwBvvrqK8xslziTJk3inHPOAcDdcXe++uor2rdvz+bNm8nPz09LeZUQRUQkI0pKSujatWvV89zcXObMmbPLcvfddx933XUXZWVlvP7667u8PmXKFKZOnQpA06ZNuf/++znyyCPZf//96dGjB/fdd19aylvv1xDN7HIzW2lm281svpmdUMf3FZlZuZktynQZRUSk/lxxxRV8/PHH3HHHHfz2t7/d6bU5c+bQsmVL+vbtC8A333zD/fffz3vvvcenn37KUUcdxW233ZaWctRrQjSzs4F7gN8DxwBvAy+b2SG7eV9b4DHgtYwXUkRE0iInJ4fVq1dXPS8uLiYnJ6fG5c855xyeffbZneZNnjyZc889t+p5ZcOaww47DDPjrLPO4u23305Leev7DPFaYIK7j3f3f7j7VcAa4LLdvO8h4FFgdqYLKCIi6XHcccexfPlyVq5cSVlZGZMnT2bkyJE7LbN8+fKqxy+++CI9evSoer5jxw6eeOKJquuHEJLskiVL+OyzzwD429/+xhFHHJGW8tbbNUQzawYcC9wZ99J04Pha3nc50BH4LXBTxgooIiJplZ2dzb333suwYcOoqKjg4osvpk+fPowZM4bCwkJGjhzJvffey6uvvkrTpk1p27Ytjz76aNX7Z86cSdeuXasa5QB06dKF3/zmNwwaNIimTZvSrVs3JkyYkJby1lu3CzPrApQAg919Zsz8McD57t6rmvccCbwKDHD3lWY2FjjD3fvWsI5LgUsBunTpcuzEiRMB6N69O61bt2bhwoUAtG/fnj59+jBzZihGdnY2RUVFLFiwgM2bNwNQWFjIunXruP35wxL6P39aNI+tW7cC0L9/f4qLiykpKQGgV69eZGVlVfWz6dSpE4ceeiizZ4cT3/3224/+/fszZ84ctm3bBsDAgQNZuXIla9euBaB3795UVFSwdOlSIBwtxV6obtWqFYWFhcyePZvS0lIAioqKWLZsGevXrwegb9++lJaWVh2Zde3alY4dO1LZTaVNmzYUFBQwa9YsysvLARg0aBCLFy9mw4YNAPTr148tW7awYsUKAPLy8mjXrh0LFiwAoG3btvTr148ZM2bg7pgZgwcPZuHChWzatAmAgoICNm7cyKpVq1L+nCqrZXr06EHz5s1ZtChcaj744IPp2bMns2bNAqB58+YMHDiQefP0Oelz0ue0L35Oubm5NXa7aLAJ0cyaA+8Bt7n749G8sdSSEGOlqx+iul2IiOw9Gko/xM+BCkL1Z6yOwNpqlu8MHAE8YmaPRPOaAGZm5cBwd5+eqcKKiMi+pd4a1bh7GTAfOCnupZMIrU3jlQBHAkfHTA8AH0WP09OsSEREhPrvmH8X8LiZzQXeAkYDXQiJDjN7DMDdL3T3b4Cd+hya2Xqg1N3VF1FERNKqXhOiu08xs/bAjYQq0UWEqs9PokVq7Y8oIiKSKfU+dJu7jwPG1fDakN28dywwNu2FEhGRfZ5u/yQiIoISooiICKCEKCIiAighioiIAEqIIiIigG4QLCIie0giQ2PWx7CYOkMUERFBCVFERARQQhQREQGUEEVERAAlRBEREUAJUUREBFBCFBERAZQQRUREACVEERERQAlRREQEUEIUEREBlBBFREQAJUQRERFACVFERARQQhQREQGUEEVERAAlRBEREUAJUUREBFBCFBERAZQQRUREACVEERERQAlRREQEUEIUEREBlBBFREQAJUQRERFACVFERARQQhQREQGUEEVERAAlRBEREUAJUUREBFBCFBERAZQQRUREgAQTopmdZWb/EvN8jJkVm9krZtY5/cUTERGpH4meIY6tfGBmBcB/AP8DNAX+kL5iiYiI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X345reXOBCXEDMrEtZCWLVsydOhQ5s6dS48ePTj++ONZt25d2nbQbdq0Ye7cuRx22GE0bdo0rUfRbdq0oaSkhJycHMrKyjCztB7pnnfeeaxfv56JEyemrdyV27ukpIRu3bpRUFBAcXFx2sp90003MWbMGFavXk1ZWRllZWVMnjw55cTVuXNnDjjgAK688kqGDRvGT3/6U0aMGEGfPn0YM2YMzz33HACXXHIJGzZsID8/n7vuuqvq7ODee+/lo48+4pZbbtmlGvqXv/wlnTp1wt0ZNGgQv//979P6HTnuuONYvnw5X3zxBRUVFQltjyXkl3EAABuuSURBVNpUlr+0tJRx48bx4x//uNbl66q8vLzqoKRDhw707NmTn//852ktd05ODitWrKgqd7qSLVD1eznttNPSvp8CaNasWdXvpqFTQsygTFwLiX1fx44def755/n+97+f1tijR49mxowZtG7dmjPOOCOtsW+99VYmTpxYFTtdJk6cyB133MGoUaN48803efzxx9NerVRWVla1vdPh/fff5+OPP+aMM87g5ptv5pNPPuGII47grLPOSkviGjduHA8//DAVFRVcfPHFVTviW265pWpH3aJFC5588kk++ugj5s6dS/fu3QG48cYb+eqrr3ZqdHHwwQcD8J//+Z/cf//9XHLJJRQXFzN27Ni0busRI0awfv163n33XcaMGZPQ9gDIy8vj2muvZcKECeTm5lad7fzsZz/juuuu469//Su/+tWv6NmzZ1oSS/v27WnZsiVnnnkm9957L5MmTeKpp55Ka7kvvvhiZs2axcUXX0xeXl7aki3AM888Q69evaqep/t388UXX6T1d5NJqV24kD2moqKCv//97/ziF7+ge/fuvPXWW2mLfdNNN/Hiiy+yefPmnfq1pcMDDzzAmDFjKC0t5fXXX691h5Sbm1vnI93KGE2bNuW8885j7ty59O/fP23l7tixIy+99BI33ngj3bt3Z8qUKSmXe/bs2cybN4+8vDzKy8txd7p27coNN9wAhMRVqTJxxbvxxhu58cYbq41fWFjIokWLkvl396hXXnmF7du3c/755zN69GhOOukkoG7bA6i6vhVv0qRJlJeX07NnT/r37191Nv6///u/Oy1XmVgGDhxYp8RiZpx66qm88cYbDB8+nDFjxvDiiy8m9DnurtwAL730Etdccw333HMP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\n",
      "text/plain": [
       "<Figure size 504x360 with 1 Axes>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "oracle = TruthTableOracle(truthtable)\n",
    "grover = Grover(oracle)\n",
    "result = grover.run(QuantumInstance(BasicAer.get_backend('qasm_simulator'), shots=1024))\n",
    "plot_histogram(result['measurement'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As shown, the search result coincides with our expectation."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
